#include "zf_gint.h"

//-------------------------------------------------------------------------------------------------------------------
//	@brief		GINT 功能初始化
//	@param		base			所选 GIT (GINT0, GINT1)
//	@param		mode			中断模式 (GINT_OR_EDGE, GINT_OR_LEVEL, GINT_AND_EDGE, GINT_AND_LEVEL)
//	@param		handler			自拟定中断服务函数
//	Sample usage:				zf_gint_init(GINT0, GINT_OR_EDGE, handler);
//-------------------------------------------------------------------------------------------------------------------
void zf_gint_init (GINT_Type *base, gint_mode_list mode, void handler(void))
{
	assert(handler != NULL);
	if(base == GINT0)
		gint_irqn_func[0] = handler;
	else
		gint_irqn_func[1] = handler;
	GINT_Init(base);
	base->CTRL =																		// 对应 GINT 控制
		(gint_comb_t)(mode&0x02) |														// 触发选项
		(gint_trig_t)((mode>>4)&0x04);
}

//-------------------------------------------------------------------------------------------------------------------
//	@brief		GINT 功能管脚选定
//	@param		base			所选 GIT (GINT0, GINT1)
//	@param		group_index		管脚组别
//	@param		pin_index		管脚索引
//	@param		trig			管脚信号捕获类型 (GINT_RISE_HIGH, GINT_FALL_LOW)
//	Sample usage:				zf_gint_pin_set(GINT0, PIO0, PIN00, GINT_FALL_LOW);
//-------------------------------------------------------------------------------------------------------------------
void zf_gint_pin_set (GINT_Type *base, group_index_list group_index, pin_index_list pin_index, gint_trig_list trig)
{
	zf_gpio_default_init(group_index, pin_index, PIN_DIR_IN);

	base->PORT_POL[group_index] &=
		~(0X00000001 << pin_index);														// 先清空原有对应 bit 设置
	base->PORT_POL[group_index] |=
		((uint32_t)trig << pin_index);													// 设置对应 pin 的信号类型

	base->PORT_ENA[group_index] |=
		(0X00000001 << pin_index);														// 使能对应 pin 的中断链接
}

//-------------------------------------------------------------------------------------------------------------------
//	@brief		PGINT 功能使能
//	@param		base			所选 GIT (GINT0, GINT1)
//	Sample usage:				zf_gint_interrupt_enable(GINT0);
//-------------------------------------------------------------------------------------------------------------------
void zf_gint_interrupt_enable (GINT_Type *base)
{
	GINT_EnableCallback(base);
}

//-------------------------------------------------------------------------------------------------------------------
//	@brief		PGINT 功能关闭
//	@param		base			所选 GIT (GINT0, GINT1)
//	Sample usage:				zf_gint_interrupt_disable(GINT0);
//-------------------------------------------------------------------------------------------------------------------
void zf_gint_interrupt_disable (GINT_Type *base)
{
	GINT_DisableCallback(base);															// 失能 GINT 中断
}
